Saving Graphs to File
- Don’t use the mouse
- Use
ggsave for ggplot
- Practice by saving the following plot to file:
ggsave("myplot.pdf")
Saving 7 x 7 in image
- Base R way: print plots “to screen”, sandwiched between
pdf()/jpeg()/png()… and dev.off().
- Vector vs. raster: Images are stored on your computer as either vector or raster.
Scales; Colour
Scale functions in ggplot2 take the form scale_[aesthetic]_[mapping]().
Let’s first focus on the following plot:

- Change the y-axis tick mark spacing to 10; change the colour spacing to include all powers of 10.

- Specify
scales::*_format in the labels argument of a scale function to do the following:
- Change the x-axis labels to dollar format (use
scales::dollar_format())
- Change the colour labels to comma format (use
scales::comma_format())

- Use
RColorBrewer to change the colour scheme.
- Notice the three different types of scales: sequential, diverging, and continuous.
p_scales +
scale_x_log10(labels=dollar_format()) +
scale_color_distiller(
trans = "log10",
breaks = 10^(1:10),
labels = comma_format(),
palette = "Green"
) +
scale_y_continuous(breaks=10*(1:10))
Unknown palette Green

- Use
viridis to change the colour to a colour-blind friendly scheme
- Hint: add
scale_colour_viridis_c (c stands for continuous; d discrete).
- You can choose a palette with
option.

Theming
Changing the look of a graphic can be achieved through the theme() layer.
There are “complete themes” that come with ggplot2, my favourite being theme_bw (I’ve grown tired of the default gray background, so theme_bw is refreshing).
- Change the theme of the following plot to
theme_bw():

- Then, change font size of axis labels, and the strip background colour. Others?

Plotly
Consider the following plot:

- Convert it to a
plotly object by applying the ggplotly() function:
- You can save a plotly graph locally as an html file. Try saving the above:
- NOTE: plotly graphs don’t seem to show up in Rmd notebooks, but they do with Rmd documents.
- Run this code to see the json format underneath:
p %>%
ggplotly() %>%
plotly_json()
Error: Package `listviewer` required for `plotly_json`.
Please install and try again.
- Check out code to make a plotly object from scratch using
plot_ly() – scatterplot of gdpPercap vs lifeExp.
- Add population to form a z-axis for a 3D plot: ggplot can also animation
What makes a plot “publication quality”? Give examples - Labels, units - Consistency - Resolution / aspect ratio - No color - Font size - Sans serif
LS0tCnRpdGxlOiAiY20wMTMgRXhlcmNpc2UiCm91dHB1dDogaHRtbF9ub3RlYm9vawplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCmBgYHtyfQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeSh0aWR5dmVyc2UpKQpsaWJyYXJ5KGdhcG1pbmRlcikKYGBgCgoKIyBTYXZpbmcgR3JhcGhzIHRvIEZpbGUKCi0gRG9uJ3QgdXNlIHRoZSBtb3VzZQotIFVzZSBgZ2dzYXZlYCBmb3IgZ2dwbG90CiAgICAtIFByYWN0aWNlIGJ5IHNhdmluZyB0aGUgZm9sbG93aW5nIHBsb3QgdG8gZmlsZTogCgpgYGB7cn0KZ2dwbG90KG10Y2FycywgYWVzKGhwLCB3dCkpICsgCiAgICBnZW9tX3BvaW50KCkKZ2dzYXZlKCJteXBsb3QucGRmIikKYGBgCgotIEJhc2UgUiB3YXk6IHByaW50IHBsb3RzICJ0byBzY3JlZW4iLCBzYW5kd2ljaGVkIGJldHdlZW4gYHBkZigpYC9ganBlZygpYC9gcG5nKClgLi4uIGFuZCBgZGV2Lm9mZigpYC4gCi0gVmVjdG9yIHZzLiByYXN0ZXI6IEltYWdlcyBhcmUgc3RvcmVkIG9uIHlvdXIgY29tcHV0ZXIgYXMgZWl0aGVyIF92ZWN0b3JfIG9yIF9yYXN0ZXJfLgogICAgLSBfX1Jhc3Rlcl9fOiBhbiBgbmAgYnkgYG1gIGdyaWQgb2YgcGl4ZWxzLCBlYWNoIHdpdGggaXRzIG93biBjb2xvdXIuIGBqcGVnYCwgYHBuZ2AsIGBnaWZgLCBgYm1wYC4KICAgIC0gX19WZWN0b3JfXzogcmVwcmVzZW50ZWQgYXMgc2hhcGVzIGFuZCBsaW5lcy4gYHBkZmAsIFtgc3ZnYF0oaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS9ncmFwaGljcy9zdmdfaW50cm8uYXNwKS4KICAgIC0gRm9yIHRpcHM6IFsiMTAgdGlwcyBmb3IgbWFraW5nIHlvdXIgUiBncmFwaGljcyBsb29rIHRoZWlyIGJlc3QiIl0oaHR0cDovL2Jsb2cucmV2b2x1dGlvbmFuYWx5dGljcy5jb20vMjAwOS8wMS8xMC10aXBzLWZvci1tYWtpbmcteW91ci1yLWdyYXBoaWNzLWxvb2stdGhlaXItYmVzdC5odG1sKS4KICAgIAojIFNjYWxlczsgQ29sb3VyCgpTY2FsZSBmdW5jdGlvbnMgaW4gYGdncGxvdDJgIHRha2UgdGhlIGZvcm0gYHNjYWxlX1thZXN0aGV0aWNdX1ttYXBwaW5nXSgpYC4KCkxldCdzIGZpcnN0IGZvY3VzIG9uIHRoZSBmb2xsb3dpbmcgcGxvdDoKCmBgYHtyfQpwX3NjYWxlcyA8LSBnZ3Bsb3QoZ2FwbWluZGVyLCBhZXMoZ2RwUGVyY2FwLCBsaWZlRXhwKSkgKwogICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1wb3ApLCBhbHBoYT0wLjIpCnBfc2NhbGVzICsgCiAgICBzY2FsZV94X2xvZzEwKCkgKwogICAgc2NhbGVfY29sb3VyX2NvbnRpbnVvdXModHJhbnM9ImxvZzEwIikKYGBgCgoxLiBDaGFuZ2UgdGhlIHktYXhpcyB0aWNrIG1hcmsgc3BhY2luZyB0byAxMDsgY2hhbmdlIHRoZSBjb2xvdXIgc3BhY2luZyB0byBpbmNsdWRlIGFsbCBwb3dlcnMgb2YgMTAuCgpgYGB7cn0KcF9zY2FsZXMgKwogICAgc2NhbGVfeF9sb2cxMCgpICsKICAgIHNjYWxlX2NvbG91cl9jb250aW51b3VzKAogICAgICAgIHRyYW5zICA9ICJsb2cxMCIsIAogICAgICAgIGJyZWFrcyA9IDEwXigxOjEwKQogICAgKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPTE6MTAqMTApCmBgYAoKMi4gU3BlY2lmeSBgc2NhbGVzOjoqX2Zvcm1hdGAgaW4gdGhlIGBsYWJlbHNgIGFyZ3VtZW50IG9mIGEgc2NhbGUgZnVuY3Rpb24gdG8gZG8gdGhlIGZvbGxvd2luZzoKICAgIC0gQ2hhbmdlIHRoZSB4LWF4aXMgbGFiZWxzIHRvIGRvbGxhciBmb3JtYXQgKHVzZSBgc2NhbGVzOjpkb2xsYXJfZm9ybWF0KClgKQogICAgLSBDaGFuZ2UgdGhlIGNvbG91ciBsYWJlbHMgdG8gY29tbWEgZm9ybWF0ICh1c2UgYHNjYWxlczo6Y29tbWFfZm9ybWF0KClgKQoKYGBge3J9CmxpYnJhcnkoc2NhbGVzKQpwX3NjYWxlcyArCiAgICBzY2FsZV94X2xvZzEwKGxhYmVscz1kb2xsYXJfZm9ybWF0KCkpICsKICAgIHNjYWxlX2NvbG91cl9jb250aW51b3VzKAogICAgICAgIHRyYW5zICA9ICJsb2cxMCIsIAogICAgICAgIGJyZWFrcyA9IDEwXigxOjEwKSwKICAgICAgICBsYWJlbHMgPSBjb21tYV9mb3JtYXQoKQogICAgKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPTEwKigxOjEwKSkKYGBgCgozLiBVc2UgYFJDb2xvckJyZXdlcmAgdG8gY2hhbmdlIHRoZSBjb2xvdXIgc2NoZW1lLgogICAgLSBOb3RpY2UgdGhlIHRocmVlIGRpZmZlcmVudCB0eXBlcyBvZiBzY2FsZXM6IHNlcXVlbnRpYWwsIGRpdmVyZ2luZywgYW5kIGNvbnRpbnVvdXMuCgpgYGB7cn0KIyMgQWxsIHBhbGV0dGVzIHRoZSBjb21lIHdpdGggUkNvbG9yQnJld2VyOgppbnN0YWxsLnBhY2thZ2VzKFJDb2xvckJyZXdlcikKUkNvbG9yQnJld2VyOjpkaXNwbGF5LmJyZXdlci5hbGwoKQpwX3NjYWxlcyArCiAgICBzY2FsZV94X2xvZzEwKGxhYmVscz1kb2xsYXJfZm9ybWF0KCkpICsKICAgIHNjYWxlX2NvbG9yX2Rpc3RpbGxlcigKICAgICAgICB0cmFucyAgID0gImxvZzEwIiwKICAgICAgICBicmVha3MgID0gMTBeKDE6MTApLAogICAgICAgIGxhYmVscyAgPSBjb21tYV9mb3JtYXQoKSwKICAgICAgICBwYWxldHRlID0gIkdyZWVuIgogICAgKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPTEwKigxOjEwKSkKYGBgCgo0LiBVc2UgYHZpcmlkaXNgIHRvIGNoYW5nZSB0aGUgY29sb3VyIHRvIGEgY29sb3VyLWJsaW5kIGZyaWVuZGx5IHNjaGVtZQogICAgLSBIaW50OiBhZGQgYHNjYWxlX2NvbG91cl92aXJpZGlzX2NgIChgY2Agc3RhbmRzIGZvciBjb250aW51b3VzOyBgZGAgZGlzY3JldGUpLgogICAgLSBZb3UgY2FuIGNob29zZSBhIHBhbGV0dGUgd2l0aCBgb3B0aW9uYC4KCmBgYHtyfQpwX3NjYWxlcyArCiAgICBzY2FsZV94X2xvZzEwKGxhYmVscz1kb2xsYXJfZm9ybWF0KCkpICsKICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYygKICAgICAgICB0cmFucyAgID0gImxvZzEwIiwKICAgICAgICBicmVha3MgID0gMTBeKDE6MTApLAogICAgICAgIGxhYmVscyAgPSBjb21tYV9mb3JtYXQoKQogICAgKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPTEwKigxOjEwKSkKYGBgCgojIFRoZW1pbmcKCkNoYW5naW5nIHRoZSBsb29rIG9mIGEgZ3JhcGhpYyBjYW4gYmUgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgYHRoZW1lKClgIGxheWVyLgoKVGhlcmUgYXJlIFsiY29tcGxldGUgdGhlbWVzIl0oaHR0cDovL2dncGxvdDIudGlkeXZlcnNlLm9yZy9yZWZlcmVuY2UvZ2d0aGVtZS5odG1sKSB0aGF0IGNvbWUgd2l0aCBgZ2dwbG90MmAsIG15IGZhdm91cml0ZSBiZWluZyBgdGhlbWVfYndgIChJJ3ZlIGdyb3duIHRpcmVkIG9mIHRoZSBkZWZhdWx0IGdyYXkgYmFja2dyb3VuZCwgc28gYHRoZW1lX2J3YCBpcyByZWZyZXNoaW5nKS4KCjEuIENoYW5nZSB0aGUgdGhlbWUgb2YgdGhlIGZvbGxvd2luZyBwbG90IHRvIGB0aGVtZV9idygpYDoKCmBgYHtyfQpnZ3Bsb3QoaXJpcywgYWVzKFNlcGFsLldpZHRoLCBTZXBhbC5MZW5ndGgsIGNvbG9yPWZhY3RvcihQZXRhbC5MZW5ndGgpKSkgKwogICAgIGZhY2V0X3dyYXAofiBTcGVjaWVzKSArCiAgICAgZ2VvbV9wb2ludCgpICsKICAgICBsYWJzKHggPSAiU2VwYWwgV2lkdGgiLAogICAgICAgICAgeSA9ICJTZXBhbCBMZW5ndGgiLAogICAgICAgICAgdGl0bGUgPSAiU2VwYWwgc2l6ZXMgb2YgdGhyZWUgcGxhbnQgc3BlY2llcyIpKwp0aGVtZV9idygpCmBgYAoKMi4gVGhlbiwgY2hhbmdlIGZvbnQgc2l6ZSBvZiBheGlzIGxhYmVscywgYW5kIHRoZSBzdHJpcCBiYWNrZ3JvdW5kIGNvbG91ci4gT3RoZXJzPwoKYGBge3J9CmdncGxvdChpcmlzLCBhZXMoU2VwYWwuV2lkdGgsIFNlcGFsLkxlbmd0aCkpICsKICAgICBmYWNldF93cmFwKH4gU3BlY2llcykgKwogICAgIGdlb21fcG9pbnQoKSArCiAgICAgbGFicyh4ID0gIlNlcGFsIFdpZHRoIiwKICAgICAgICAgIHkgPSAiU2VwYWwgTGVuZ3RoIiwKICAgICAgICAgIHRpdGxlID0gIlNlcGFsIHNpemVzIG9mIHRocmVlIHBsYW50IHNwZWNpZXMiKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTgpLAogICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJvcmFuZ2UiKSkKYGBgCgoKIyBQbG90bHkKCkNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgcGxvdDoKCmBgYHtyfQoocCA8LSBnYXBtaW5kZXIgJT4lIAogICAgIGZpbHRlcihjb250aW5lbnQgIT0gIk9jZWFuaWEiKSAlPiUgCiAgICAgZ2dwbG90KGFlcyhnZHBQZXJjYXAsIGxpZmVFeHApKSArCiAgICAgZ2VvbV9wb2ludChhZXMoY29sb3VyPXBvcCksIGFscGhhPTAuMikgKwogICAgIHNjYWxlX3hfbG9nMTAobGFiZWxzPWRvbGxhcl9mb3JtYXQoKSkgKwogICAgIHNjYWxlX2NvbG91cl9kaXN0aWxsZXIoCiAgICAgICAgIHRyYW5zICAgPSAibG9nMTAiLAogICAgICAgICBicmVha3MgID0gMTBeKDE6MTApLAogICAgICAgICBsYWJlbHMgID0gY29tbWFfZm9ybWF0KCksCiAgICAgICAgIHBhbGV0dGUgPSAiR3JlZW5zIgogICAgICkgKwogICAgIGZhY2V0X3dyYXAofiBjb250aW5lbnQpICsKICAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPTEwKigxOjEwKSkgKwogICAgIHRoZW1lX2J3KCkpCmBgYAoKMS4gQ29udmVydCBpdCB0byBhIGBwbG90bHlgIG9iamVjdCBieSBhcHBseWluZyB0aGUgYGdncGxvdGx5KClgIGZ1bmN0aW9uOgoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoInBsb3RseSIpCmxpYnJhcnkocGxvdGx5KQpwICU+JSAKICAgIGdncGxvdGx5KCkKYGBgCgoyLiBZb3UgY2FuIHNhdmUgYSBwbG90bHkgZ3JhcGggbG9jYWxseSBhcyBhbiBodG1sIGZpbGUuIFRyeSBzYXZpbmcgdGhlIGFib3ZlOgogICAgLSBOT1RFOiBwbG90bHkgZ3JhcGhzIGRvbid0IHNlZW0gdG8gc2hvdyB1cCBpbiBSbWQgX25vdGVib29rc18sIGJ1dCB0aGV5IGRvIHdpdGggUm1kIF9kb2N1bWVudHNfLgoKYGBge3J9CnAgJT4lIAogICAgZ2dwbG90bHkoKSAlPiUgCiAgICBodG1sd2lkZ2V0czo6c2F2ZVdpZGdldCgicGxvdC5odG1sIikKYGBgCgoKMy4gUnVuIHRoaXMgY29kZSB0byBzZWUgdGhlIGpzb24gZm9ybWF0IHVuZGVybmVhdGg6CgpgYGB7cn0KcCAlPiUgCiAgICBnZ3Bsb3RseSgpICU+JSAKICAgIHBsb3RseV9qc29uKCkKYGBgCgoKNC4gQ2hlY2sgb3V0IGNvZGUgdG8gbWFrZSBhIHBsb3RseSBvYmplY3QgZnJvbSBzY3JhdGNoIHVzaW5nIGBwbG90X2x5KClgIC0tIHNjYXR0ZXJwbG90IG9mIGdkcFBlcmNhcCB2cyBsaWZlRXhwLgogICAgLSBDaGVjayBvdXQgdGhlIFtjaGVhdCBzaGVldF0oaHR0cHM6Ly9pbWFnZXMucGxvdC5seS9wbG90bHktZG9jdW1lbnRhdGlvbi9pbWFnZXMvcl9jaGVhdF9zaGVldC5wZGYpLgoKYGBge3J9CnBsb3RfbHkoZ2FwbWluZGVyLCAKICAgICAgICB4ID0gfmdkcFBlcmNhcCwgCiAgICAgICAgeSA9IH5saWZlRXhwLCAKICAgICAgICB0eXBlID0gInNjYXR0ZXIiLAogICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgb3BhY2l0eSA9IDAuMikgJT4lIAogICAgbGF5b3V0KHhheGlzID0gbGlzdCh0eXBlID0gImxvZyIpKQpgYGAKCjUuIEFkZCBwb3B1bGF0aW9uIHRvIGZvcm0gYSB6LWF4aXMgZm9yIGEgM0QgcGxvdDoKZ2dwbG90IGNhbiBhbHNvIGFuaW1hdGlvbgoKYGBge3J9CmxpYnJhcnkoZ2dhbmltYXRlKQpwbG90X2x5KGdhcG1pbmRlciwgCiAgICAgICAgeCA9IH5nZHBQZXJjYXAsIAogICAgICAgIHkgPSB+bGlmZUV4cCwgCiAgICAgICAgeiA9IH5wb3AsCiAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgb3BhY2l0eSA9IDAuMikKYGBgCgpXaGF0IG1ha2VzIGEgcGxvdCDigJxwdWJsaWNhdGlvbiBxdWFsaXR54oCdPyBHaXZlIGV4YW1wbGVzCi0gTGFiZWxzLCB1bml0cwotIENvbnNpc3RlbmN5Ci0gUmVzb2x1dGlvbiAvIGFzcGVjdCByYXRpbwotIE5vIGNvbG9yCi0gRm9udCBzaXplCi0gU2FucyBzZXJpZgoK